package com.run2code.netty.server;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.socket.SocketChannel;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Netty 服务端处理类
 * 关注公众号【奔跑的码畜】，一起进步不迷路
 *
 * @author 第七人格
 * @date 2023/11/07
 */
public class MyServerHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        SocketChannel channel = (SocketChannel) ctx.channel();
        System.out.println("[管道激活时]监听到有一客户端链接到服务端...服务端IP:" + channel.localAddress().getHostString()
                + "，服务端端口:" + channel.localAddress().getPort());
        //通知客户端链接建立成功
        String str = "[管道激活时]通知客户端链接建立成功" + " " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())
                + " "
                + channel.localAddress().getHostString() + "\r\n";
        ctx.writeAndFlush(str);
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        // 这里我们已经不再需要自己手动进行解码了，因为Netty已经帮我们自动解码了
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())
                + " [服务端]接收到[客户端]消息：" + msg);
        //通知客户端链消息发送成功
        String str = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())
                + " 服务端已经接收到信息了，消息内容[" + msg + "]" + "\r\n";
        ctx.writeAndFlush(str);
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) {
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())
                + " [客户端]断开链接" + "服务端[" + ctx.channel().localAddress().toString() + "]");
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        ctx.close();
        System.out.println("异常信息：\r\n" + cause.getMessage());
    }

}
